# 07 - 命令系统

## 概述

命令系统处理用户输入的 `/` 斜杠命令（如 `/commit`、`/compact`、`/vim`）。

---

## 三种命令类型

| 类型 | 执行方式 | 适用场景 |
|------|----------|----------|
| **Prompt** | 将命令转为 LLM 提示 | 需要 AI 参与的命令（/commit, /review） |
| **Local** | 直接执行代码 | 纯本地操作（/clear, /exit, /cost） |
| **Local JSX** | 渲染 React UI | 需要交互式 UI 的命令（/install, /mcp） |

---

## 命令定义

```typescript
type Command = {
  name: string               // 命令名（不含 /）
  description: string        // 简短描述
  aliases?: string[]         // 别名
  isHidden?: boolean         // 是否隐藏
  availability?: 'claude-ai' | 'console'  // 可用环境
  argDescription?: string    // 参数说明
  args?: { name; description; required }[]  // 结构化参数
  isDisabled?: () => string | false  // 禁用检查（返回原因或 false）
  progressMessage?: string   // 进度提示
  userFacingName?: () => string  // 用户可见名称

  // 三种类型只实现其一
  getPromptForCommand?: (args, context) => Promise<string>  // Prompt 类型
  call?: (args, context) => Promise<void>                   // Local 类型
  callJSX?: (onDone) => React.ReactNode                     // Local JSX 类型
}
```

---

## 命令加载优先级

命令按以下顺序加载，高优先级覆盖低优先级同名命令：

```
1. 内置技能 (bundled skills)      — 最高优先级
2. 内置插件 (built-in plugins)
3. 技能目录 (skill directory)
4. 工作流 (workflows)
5. 插件 (plugins)
6. 内置命令 (built-in commands)   — 最低优先级
```

---

## Prompt 类型命令

最常见的类型。命令只负责生成一段提示文本，然后交给 LLM 执行。

例如 `/commit`：

```typescript
// commands/commit.ts (概念简化)
{
  name: 'commit',
  description: 'Create a git commit',
  async getPromptForCommand(args, context) {
    return `Create a git commit with the following guidelines:
    - Summarize changes accurately
    - Follow conventional commit format
    - ...
    ${args ? `User notes: ${args}` : ''}`
  }
}
```

生成的提示发送给 Claude，Claude 自主决定调用哪些 Tool（git diff, git commit 等）。

---

## Local 类型命令

直接在本地执行，不涉及 LLM：

```typescript
// 例如 /cost
{
  name: 'cost',
  description: 'Show token usage and cost',
  async call(args, context) {
    const cost = getTotalCost()
    const usage = getModelUsage()
    // 直接输出到终端
  }
}
```

---

## Local JSX 类型命令

渲染交互式 React 组件：

```typescript
// 例如 /install
{
  name: 'install',
  callJSX(onDone) {
    return <InstallScreen onDone={onDone} />
  }
}
```

组件渲染后接管终端 UI，用户交互完成后调用 `onDone()` 返回主循环。

---

## 完整命令列表（部分）

### 核心操作
| 命令 | 类型 | 说明 |
|------|------|------|
| `/commit` | Prompt | 创建 git commit |
| `/review` | Prompt | 代码审查 |
| `/compact` | Local | 压缩对话上下文 |
| `/clear` | Local | 清除对话历史 |
| `/exit` | Local | 退出 |

### 配置与管理
| 命令 | 类型 | 说明 |
|------|------|------|
| `/config` | JSX | 管理设置 |
| `/mcp` | JSX | MCP 服务器管理 |
| `/model` | Local | 切换模型 |
| `/permissions` | JSX | 权限管理 |
| `/memory` | Prompt | 管理持久记忆 |

### 会话控制
| 命令 | 类型 | 说明 |
|------|------|------|
| `/resume` | JSX | 恢复之前的会话 |
| `/share` | Local | 分享会话 |
| `/session` | Local | 会话管理 |
| `/diff` | Local | 查看本会话的更改 |

### 开发工具
| 命令 | 类型 | 说明 |
|------|------|------|
| `/doctor` | JSX | 环境诊断 |
| `/vim` | Local | 切换 Vim 模式 |
| `/theme` | JSX | 切换主题 |
| `/voice` | Local | 语音输入 |
| `/cost` | Local | 查看费用 |
| `/usage` | Local | 查看使用量 |

### 集成与扩展
| 命令 | 类型 | 说明 |
|------|------|------|
| `/login` | JSX | 登录 |
| `/logout` | Local | 登出 |
| `/install` | JSX | 安装 IDE 扩展 |
| `/plugin` | Local | 插件管理 |
| `/skills` | Local | 技能管理 |

### 高级功能
| 命令 | 类型 | 说明 |
|------|------|------|
| `/plan` | Local | 进入计划模式 |
| `/tasks` | JSX | 任务管理 |
| `/desktop` | Local | 移交到桌面应用 |
| `/mobile` | Local | 移交到移动应用 |
| `/teleport` | Local | 传送到远程环境 |

---

## 命令与 Tool 的区别

| | 命令 (Command) | 工具 (Tool) |
|---|---|---|
| 触发者 | **用户**（输入 / 前缀） | **模型**（tool_use 块） |
| 定义位置 | `src/commands/` | `src/tools/` |
| 权限检查 | 无（用户主动触发） | 有（每次调用都检查） |
| 与 LLM 关系 | Prompt 类型会发送给 LLM | LLM 主动调用 |
| 注册方式 | 命令加载管道 | `getAllBaseTools()` |
